ZFS系列补充(三)为什么你应该使用ECC RAM


背景

随着ZFS扩展到FreeBSD、Linux、FreeNAS、Illumos和许多其他操作系统,以及OpenZFS的引入,将所有项目统一到一个整体下,越来越多的人开始在许多不同的情况下使用并修复ZFS的一些问题。有些人将其安装在主生产服务器上,有些人将其安装在大型后端存储阵列上,甚至还有一些人将其安装在他们的工作站或笔记本电脑上。随着ZFS越来越流行,您将看到越来越多的ZFS安装在商品硬件上,而不是企业硬件上。因此,您将看到越来越多的ZFS安装在不支持ECC RAM的硬件上。

我在这里提出的问题是:这是个坏主意吗?如果您花一些时间在Web上搜索,您会发现一篇又一篇关于为什么应该为ZFS安装选择ECC RAM的文章,这些文章有很好的论点,也有很好的理由。本文我希望重申这些观点,并为ECC RAM辩护。您的链的强度取决于最薄弱的一环,如果该链接是非ECC RAM,那么您将失去ZFS开发人员为防止数据损坏而付出的所有努力。

好的RAM vs 坏的RAM vs ECC RAM

首先,让我们明确区分“好RAM”和“坏RAM”,以及它们与“ECC RAM”的区别:

  • 好的RAM – 有很低失败率的高质量RAM模块
  • 坏的RAM – 有很高失败率的低质量RAM模块
  • ECC RAM – 具有纠错能力的RAM模块

“坏RAM”并不一定是非ECC RAM。我过去部署过“坏的”(质量不好的)ECC RAM,即使它们有纠错能力,但它们经常失败,需要更换。也就是说,ECC RAM不一定就是“好RAM”。比如我有这样的经历,已经部署了多年的非ECC RAM,它没有纠错功能,但一直也没有看到数据损坏的文件。关键是,您可以有例外的非ECC“好RAM”,它永远不会让您失败,也可以有可怕的ECC“坏RAM”,它仍然会造成数据损坏。

你需要注意的是失败率。一个ECC RAM模块可能与一个具有相同构建质量的非ECC模块一样频繁地发生故障。希望失败率是这样的,ECC可以修复它检测到的错误,并且仍然在没有数据损坏的情况下运行。但是ECC RAM和硬件的故障率是脱节的,这可能是徒劳无功。只是因为它是ECC RAM并不意味着硬件故障的频率更低。ECC的全部意思是,它检测故障,并试图纠正它们。

ECC RAM

失败率很难控制。如果你读过维基百科关于ECC RAM的文章,它提到了一些研究,这些研究试图掌握内存模块中发生bit错误的频率:

2007年至2009年间发表的研究显示,错误率变化很大,差异超过7个数量级,范围从10^(−10)[到]10^(−17)error/bit-h[ours]。在SIGMETRICS/Performance ‘ 09会议上提出了一项基于谷歌的大量服务器的非常大规模的研究。发现的实际错误率比之前的小规模或实验室研究高出几个数量级,每兆位(约2.5^(-7)x 10^(- 11)error/bit-h[ours])每十亿台设备小时25,000到70,000个错误(即:以最大错误率计算,8GB RAM每小时约5个单比特错误),每年有超过8%的内存模块受到错误的影响。

粗略地说,从谷歌在他们的数据中心所看到的,在他们安装的8%的RAM中,每小时8GB的RAM中有5位错误。如果你不认为这很重要,那你就是在欺骗自己。大多数这些位错是由背景辐射影响已安装的内存条造成的,这是由于宇宙射线产生的中子。但是电压波动,坏的电路,仅仅是差的构建质量也可以作为“位翻转”的因素。

ECC RAM通过每个字节使用一个额外的奇偶校验位来检测这个坏位。换句话说,对于每8位,就有一个第9位奇偶校验位,它作为前8位的校验和。因此,对于一个在系统中注册为64GB的内存模块,实际上有72GB的物理安装在芯片上,以便为奇偶校验提供空间。然而,需要注意的是,ECC RAM每字节只能纠正1位翻转(8位)。如果每字节有2位翻转,ECC RAM将无法恢复数据。

ZFS被设计用于检测由于硬件和其他因素而发生的静默数据错误。ZFS从上到下对数据进行校验,以确保没有数据损坏。如果您从一开始就阅读了本系列文章,那么您就会知道ZFS是如何构建的,以及ZFS是如何优先考虑数据完整性。使用ZFS的人之所以使用它,是因为他们无法忍受文件系统中任何地方、任何时候的数据损坏。但是,如果您的RAM不是ECC RAM,那么您就不能保证您的文件在存储到磁盘时不会损坏。如果文件由于RAM中的某个bit损坏而在RAM中损坏,那么当存储到ZFS时,它将使用这个坏位进行校验,因为ZFS将假定它正在接收的数据是好的。因此,您的ZFS数据集中有损坏的数据,并且这个已经损坏的数据会被当作完好的数据来校验,并且没有办法在内部修复错误。这是一件很糟糕的事情。
简单的说,就是不用ECC RAM的话,很可能数据在存储到ZFS前,在内存中已经就损坏了,这样ZFS自然没有办法知道,也没办法修复

一个场景

为了更深入地了解ZFS中的ECC RAM,让我们创建一个场景。让我们假设您没有使用ECC RAM。也许它安装在您的工作站上或笔记本电脑上,因为您喜欢ZFS用户空间工具,并且喜欢ZFS背后的思想。你想在本地使用它。但是,让我们假设您有上面定义的非ECC “Bad RAM”。不管出于什么原因,您的一个RAM模块中出现了一个“冻结位”。DIMM只在特定位置存储“0”或“1”。假设由于硬件故障,它总是报告一个“0”,不管应该在那里写什么。为了简单起见,我们将在示例中查看8位,即1字节。我用红色的“0”表示坏的部分。

你的应用程序希望写“11001011”,但由于你的坏RAM,你以“11000011”结束。因此,“11000011”被发送到ZFS进行存储。ZFS将校验和添加到“11000011”并将其存储在池中。您有数据损坏,而ZFS并不知道。ZFS假设从RAM输出的数据是正确的,因此奇偶校验和校验都是基于该结果计算的。

但是,当您从磁盘读取数据并将其存储回故障的非ECC RAM中时,会发生什么呢?在这一点上,事情变得很糟糕。所以,你读回“11000011”到RAM。然而,在它被发送到磁盘之前,它被存储在几乎相同的位置。假设它只存储了4位。然后,你得到“01000011”。不仅你的文件在磁盘上损坏了,而且你把它们存储到有故障的硬件所在的RAM中,使事情变得更糟。但是,ZFS是为了纠正这个问题而设计的,对吧?所以,我们可以修复坏位到“11000011”,但问题是数据仍然是损坏的!

事情从这里开始越来越糟糕。因为这是一个物理硬件故障,我们实际上不能将第一个位设置为“1”。因此,任何这样做的尝试都会立即将其恢复为“0”。因此,当数据存储在我们错误的非ECC RAM中时,字节将保持为“01000011”。现在,假设我们准备将RAM中的数据刷新到磁盘上,我们将“01000011”存储在磁盘上,从而加剧了我们的错误。ZFS计算一个新的校验和基于新损坏的数据,并再次认为DIMM模块告诉我们的就是实际的值,但其实不是,这样下去就进一步损坏了我们的数据。

正如您所看到的,我们对非ECC RAM读写的数据越多,文件系统中损坏数据的可能性就越大。ZFS旨在保护我们不受这种情况的影响,但我们的保护链的强度是受最薄弱的环节决定,在本例中是非ECC RAM破坏了我们的数据。

您可能认为备份可以拯救您。如果你有一个未损坏的文件,你可以恢复,很好。但是,如果您的ZFS快照或rsync(1)复制了损坏的位到您的备份,那么您就没辙了。ZFS数据清理在这里也帮不了你。如前所述,您正确地将损坏的数据存储在磁盘上,这意味着损坏字节的checksum是正确的。然而,如果您在RAM中有额外的坏位,擦洗实际上会尝试“修复”坏位。但是,因为这是硬件故障,导致位冻结,所以擦洗将继续,继续,使您的池发生抖动。因此,数据清理(scrub)实际上会使性能下降,试图修复RAM中的一个坏比特。此外,数据清理不会修复池中已经正确校验的坏位。

无论你如何分割它,你信任你的非ECC RAM,而你信任的RAM出现了错误,而且你没有尝试恢复的手段和方法。

ECC价格

由于内存上的额外硬件,ECC RAM肯定比非ECC RAM更贵,但不是很多。事实上,因为ECC dimm有9/8额外的硬件,价格非常接近这一点。根据我的经验,64GB的ECC RAM大约比64GB的非ECC RAM贵9/8。许多通用主板也将支持无缓冲ECC RAM,尽管您应该选择支持主动ECC scrub的主板,以保持位损坏最小化。

你可以获得高质量的ECC DDR3 SDRAM从新蛋大约50美元每4GB。非ECC DDR3 SDRAM的零售价几乎完全相同。对我来说,这是显而易见的。你所需要的只是一个支持它的主板,并且支持ECC RAM的Supermicro主板也可以相对便宜。我知道这是主观的,但我最近构建了一个双节点的KVM管理程序共享存储集群,每个主机上有32 GB的注册ECC RAM和Tyan主板。

所有32GB的总成本肯定比系统中的其他所有东西都要高,但我能够以每16GB 150美元的价格购买它们,或者以每64GB 600美元的价格购买它们。每个主板的价格是250美元,两块价格总共是500美元。所以,对于两个非常强大的服务器,我总共花费了1100美元,不包含CPU和磁盘等。对我来说,这是确保数据完整性的一项小投资,如果采用非ECC的RAM,也不会节省多少钱。小小的额外投资是非常值得的,能够确保我从上到下拥有数据完整性。

总结

ZFS从头开始构建,具有奇偶校验、镜像、校验和和其他机制来保护数据。如果校验和失败,ZFS可以尝试基于池中的冗余加载良好的数据,并修复损坏的位。但是ZFS假设一个正确的checksum,意味着在应用checksum之前位是正确的。这就是ECC RAM如此关键的地方。ECC RAM可以大大降低比特在存储到池中之前不正确的风险。

所以,你应该从这篇文章中吸取一些教训:

  • ZFS校验和假设来自RAM的数据是正确的。
  • 常规的ZFS数据清理将极大地降低损坏位的风险,但对于非ecc RAM硬件故障,这可能是您最大的敌人。
  • 备份的好坏取决于它们存储的数据。如果备份损坏了,那就不是备份。
  • ZFS校验数据、chechsum和物理数据都需要匹配。如果不匹配,就需要开始维修了。如果由于非ECC RAM在门外就坏了,那么你使用ZFS有什么意义呢?

感谢FreeBSD论坛上的“cyberjock”对这篇文章的启发。

参考资料

https://pthree.org/2013/12/10/zfs-administration-appendix-c-why-you-should-use-ecc-ram/

如果你觉得本文对你有帮助,欢迎打赏